#include "ft5206.h"
#include "main.h"
#include "app_lvgl.h"

_ft5206_data ft5206_data;

//初始化FT5206触摸屏
//返回值:0,初始化成功;1,初始化失败 
esp_err_t ft5206_init(void)
{
    esp_err_t ret =0;
	uint8_t temp[2]; 
	
	temp[0]=0;
	FT5206_WR_Reg_Len(FT5206_DEVIDE_MODE,temp,1);	//进入正常操作模式 
	FT5206_WR_Reg_Len(FT5206_ID_G_MODE,temp,1);		//查询模式 
	temp[0]=22;								//触摸有效值，22，越小越灵敏	
	FT5206_WR_Reg_Len(FT5206_ID_G_THGROUP,temp,1);	//设置触摸有效值
	temp[0]=12;								//激活周期，不能小于12，最大14
	FT5206_WR_Reg_Len(FT5206_ID_G_PERIODACTIVE,temp,1); 
	//读取版本号，参考值：0x3003
	FT5206_RD_Reg_Len(FT5206_ID_G_LIB_VERSION,&temp[0],2);
    ft5206_DEBUG("读取寄存器:%x %x\r\n",temp[0],temp[1]);  

	if(temp[0]==0X30&&temp[1]==0X08)//版本:0X3008
	{
		//ft5206_DEBUG("CTP ID:%x\r\n",((uint16_t)temp[0]<<8)+temp[1]);
		ret = 0;

		FT5206_RD_Reg_Len(FT5206_ID_G_STA,&temp[0],1);
		ft5206_DEBUG("工作模式:%d\r\n",temp[0]);  

		ft5206_DEBUG("初始化成功\r\n");
		xTaskCreate(ft5206_test_task,"ft5206_test_task",1024*2,NULL,10,NULL);
	}else
    {
        ft5206_DEBUG("初始化失败\r\n");
       ret= 1; 
    }   
    return ret;
}


void ft5206_test_task(void *pvParameter)
{
	while (1) 
    {
        FT5206_Scan(0);

        if(ft5206_data.sta&TP_PRES_DOWN)
        {
            mouse_x = ft5206_data.x[0];
            mouse_y = ft5206_data.y[0];
            mouse_sta = 1;

        }else
        {
            mouse_sta = 0;
        }
        
        
        vTaskDelay(5 / portTICK_PERIOD_MS); 
 	}
	vTaskDelete(NULL);
}

//向FT5206写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
uint8_t FT5206_WR_Reg_Len(uint16_t reg,uint8_t *buf,uint8_t len)
{
	uint8_t i;
	uint8_t ret=0;
	IIC_Start();	 
	IIC_Send_Byte(FT5206_CMD_WR);	//发送写命令 	 
	IIC_Wait_Ack(); 	 										  		   
	IIC_Send_Byte(reg&0XFF);   	//发送低8位地址
	IIC_Wait_Ack();  
	for(i=0;i<len;i++)
	{	   
    	IIC_Send_Byte(buf[i]);  	//发数据
		ret=IIC_Wait_Ack();
		if(ret)break;  
	}
    IIC_Stop();					//产生一个停止条件	    
	return ret; 
}
//从FT5206读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度			  
void FT5206_RD_Reg_Len(uint16_t reg,uint8_t *buf,uint8_t len)
{
	uint8_t i; 
 	IIC_Start();	
 	IIC_Send_Byte(FT5206_CMD_WR);   	//发送写命令 	 
	IIC_Wait_Ack(); 	 										  		   
 	IIC_Send_Byte(reg&0XFF);   	//发送低8位地址
	IIC_Wait_Ack();  
 	IIC_Start();  	 	   
	IIC_Send_Byte(FT5206_CMD_RD);   	//发送读命令		   
	IIC_Wait_Ack();	   
	for(i=0;i<len;i++)
	{	   
    	buf[i]=IIC_Read_Byte(i==(len-1)?0:1); //发数据	  
	} 
    IIC_Stop();//产生一个停止条件     
} 

const uint16_t FT5206_TPX_TBL[5]={FT5206_TP1_REG,FT5206_TP2_REG,FT5206_TP3_REG,FT5206_TP4_REG,FT5206_TP5_REG};
//扫描触摸屏(采用查询方式)
//mode:0,正常扫描.
//返回值:当前触屏状态.
//0,触屏无触摸;1,触屏有触摸
uint8_t FT5206_Scan(uint8_t mode)
{
	uint8_t buf[4];
	uint8_t i=0;
	uint8_t res=0;
	uint8_t temp;
	static uint8_t t=0;//控制查询间隔,从而降低CPU占用率   

#if 0
    FT5206_RD_Reg_Len(FT5206_REG_NUM_FINGER,&ft5206_data.sta,1);//读取触摸点的状态 
    //ft5206_DEBUG("触摸状态:%d\r\n",ft5206_data.sta);
    if(ft5206_data.sta)
    {
        //ft5206_data.sta=1;
        //ft5206_DEBUG("触摸按下开始读取坐标值\r\n");
        for(i=0;i<2;i++)
        {
            //if(ft5206_data.sta&(1<<i))	//触摸有效?
            {
                FT5206_RD_Reg_Len(FT5206_TPX_TBL[i],buf,4);	//读取XY坐标值 

                ft5206_data.x[i]=((uint16_t)(buf[0]&0X0F)<<8)+buf[1];
                ft5206_data.y[i]=((uint16_t)(buf[2]&0X0F)<<8)+buf[3];
   
                if((buf[0]&0XF0)!=0X80)
				{
                    ft5206_data.x[i]=ft5206_data.y[i]=0;//必须是contact事件，才认为有效
				}
				else
				{
					ft5206_data.x[i] = 240-ft5206_data.x[i];
					ft5206_data.y[i] = 240-ft5206_data.y[i];					
				}
					
                ft5206_DEBUG("x[%d]:%d y[%d]:%d\r\n",i,ft5206_data.x[i],i,ft5206_data.y[i]);
            }			
        }
        
    }else
    {
        ft5206_data.sta=0;
    }
   
#else
	t++;
	if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
	{
		FT5206_RD_Reg_Len(FT5206_REG_NUM_FINGER,&mode,1);//读取触摸点的状态  
		if((mode&0XF)&&((mode&0XF)<6))
		{
			temp=0XFF<<(mode&0XF);//将点的个数转换为1的位数,匹配ft5206_data.sta定义 
			ft5206_data.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES; 
			for(i=0;i<2;i++)
			{
				if(ft5206_data.sta&(1<<i))	//触摸有效?
				{
					FT5206_RD_Reg_Len(FT5206_TPX_TBL[i],buf,4);	//读取XY坐标值 
					if(1)//ft5206_data.touchtype&0X01)//横屏
					{
						ft5206_data.x[i]=((u16)(buf[0]&0X0F)<<8)+buf[1];
						ft5206_data.y[i]=((u16)(buf[2]&0X0F)<<8)+buf[3];
					}else
					{
						ft5206_data.x[i]=480-(((u16)(buf[0]&0X0F)<<8)+buf[1]);
						ft5206_data.y[i]=((u16)(buf[2]&0X0F)<<8)+buf[3];
					}  
					if((buf[0]&0XF0)!=0X80)
                        ft5206_data.x[i]=ft5206_data.y[i]=0;//必须是contact事件，才认为有效
                    ft5206_data.x[i] = 240-ft5206_data.x[i];
                    ft5206_data.y[i] = 240-ft5206_data.y[i];
					//ft5206_DEBUG("x[%d]:%d,y[%d]:%d\r\n",i,ft5206_data.x[i],i,ft5206_data.y[i]);
				}			
			} 
			res=1;
			if(ft5206_data.x[0]==0 && ft5206_data.y[0]==0)mode=0;	//读到的数据都是0,则忽略此次数据
			t=0;		//触发一次,则会最少连续监测10次,从而提高命中率
		}
	}
	if((mode&0X1F)==0)//无触摸点按下
	{ 
		if(ft5206_data.sta&TP_PRES_DOWN)	//之前是被按下的
		{
			ft5206_data.sta&=~(1<<7);	//标记按键松开
		}else						//之前就没有被按下
		{ 
			ft5206_data.x[0]=0xffff;
			ft5206_data.y[0]=0xffff;
			ft5206_data.sta&=0XE0;	//清除点有效标记	
		}	 
	} 	
	if(t>240)t=10;//重新从10开始计数
#endif    
	return res;
}
 






